// File: jmcomic-core/src/main/java/dev/jukomu/common/util/system/ApplicationMessageCenter.java
package dev.jukomu.common.util.system;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 对应Python的ApplicationMessageCenter，用于收集应用程序消息。
 * 特别是需要用户确认的消息。
 */
public class ApplicationMessageCenter {

    // 使用ConcurrentHashMap存储消息，key可以是线程ID或其他唯一标识
    // List<String> 存储该key下的所有消息
    private static final Map<Object, List<String>> msgNeedToConfirm = new ConcurrentHashMap<>();

    /**
     * 获取当前消息中心的键。
     * 默认情况下，在Java中不使用线程作为键，而是使用一个固定值，
     * 除非明确需要线程隔离的消息。
     *
     * @return 消息中心的键
     */
    private static Object ofKey() {
        // Python中默认使用current_thread()。
        // 如果需要线程隔离的消息，可以使用Thread.currentThread().getId()。
        // 但对于通用应用消息，通常不需要严格的线程隔离，一个固定键即可。
        return 1; // 简单起见，使用固定键
    }

    /**
     * 添加一条消息到消息中心。
     *
     * @param msg 消息内容
     * @param key 消息的键（可选），如果为null则使用默认键
     */
    public static void appendMsg(String msg, Object key) {
        Object actualKey = (key != null) ? key : ofKey();
        // putIfAbsent 确保List存在，然后同步添加消息
        msgNeedToConfirm.computeIfAbsent(actualKey, k -> Collections.synchronizedList(new ArrayList<>())).add(msg);
    }

    /**
     * 获取指定键下的所有消息。
     *
     * @param key 消息的键（可选），如果为null则使用默认键
     * @return 消息列表，如果不存在则返回空列表
     */
    public static List<String> getMsgsNeedToConfirm(Object key) {
        Object actualKey = (key != null) ? key : ofKey();
        return msgNeedToConfirm.getOrDefault(actualKey, Collections.emptyList());
    }

    /**
     * 获取默认键下的所有消息。
     *
     * @return 消息列表，如果不存在则返回空列表
     */
    public static List<String> getMsgsNeedToConfirm() {
        return getMsgsNeedToConfirm(null);
    }

    /**
     * 清空指定键下的所有消息。
     *
     * @param key 消息的键（可选），如果为null则使用默认键
     */
    public static void clearMsgs(Object key) {
        Object actualKey = (key != null) ? key : ofKey();
        msgNeedToConfirm.remove(actualKey);
    }

    /**
     * 清空默认键下的所有消息。
     */
    public static void clearMsgs() {
        clearMsgs(null);
    }

    // 私有构造函数，防止实例化
    private ApplicationMessageCenter() {
    }
}